home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dviapollo / genwindow.c- < prev    next >
Text File  |  1990-10-01  |  4KB  |  144 lines

  1. #include "header.h"
  2. #include "genwindow.h"
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. char *malloc();
  6. void shownextpage();
  7. void open_dvi_file ();
  8.  
  9. void CloseDvi (dviw)
  10.      DVIW dviw;
  11. {
  12.   close_fonts ();
  13.   fclose (dviw -> dvifp);
  14.   free (dviw -> filename);
  15.   free (dviw);
  16. };
  17.  
  18. DVIW OpenDvi (filename)
  19.      char *filename;
  20. {
  21.   return (ReOpenDvi (NULL, filename));
  22. }
  23.  
  24. /* This takes dviw by reference because it will change dviw if the dvi */
  25.  /* file has been modified since it was opened.  This tends to prevent */
  26.  /* horrible things from happening when you use latex to regenerate a */
  27.  /* file you are displaying. */
  28. int ShowDviPage (dviw, pagenum, xscreen, yscreen)
  29.      DVIW *dviw;
  30.      int pagenum;
  31.      int xscreen;
  32.      int yscreen;
  33. {
  34.   if (modtime ((*dviw)->filename) != (*dviw) -> modtime) {
  35.     /* The file has been modified since last opened. */
  36.     char *filetmp = malloc (strlen ((*dviw) -> filename) + 1);
  37.  
  38.     strcpy (filetmp, (*dviw) -> filename);
  39.     *dviw = ReOpenDvi (*dviw, filetmp);
  40.     free (filetmp);
  41.     showerror ("Your file changed.");
  42.   } else {
  43.     clearerror ();
  44.   };
  45.   if (pagenum > (*dviw) -> pages) {
  46.     pagenum = (*dviw) -> pages;
  47.   } else if (pagenum <= 0) {
  48.     pagenum = 1;
  49.   };
  50.   clearscreen ();
  51.   lock_canvas ();
  52.   draw_borders ();
  53.   if (pagenum == (*dviw) -> pagenum) {
  54.     check (fseek ((*dviw) -> dvifp, (*dviw) -> cpagep, 0));
  55.     shownextpage (*dviw, xscreen, yscreen);
  56.   } else if (pagenum == ((*dviw) -> pagenum + 1)) {
  57.     shownextpage (*dviw, xscreen, yscreen);
  58.   } else if (pagenum > ((*dviw) -> pagenum)) {
  59.     showpage (&((*dviw) -> cpagep), &((*dviw) -> ppagep), TRUE,
  60.           pagenum - ((*dviw) -> pagenum),
  61.           FALSE, (*dviw) -> dvifp, xscreen, yscreen);
  62.     (*dviw) -> pagenum = pagenum + 1;
  63.   } else if (pagenum < ((*dviw) -> pagenum)) {
  64.     while ((pagenum < ((*dviw) -> pagenum)--) && (*dviw) -> ppagep != -1) {
  65.       /* Each iteration here backs up a page. */
  66.       check (fseek((*dviw) -> dvifp, (*dviw) -> ppagep, 0));
  67.       Nosignextend((*dviw) -> dvifp, 1);
  68.       {
  69.     int i;
  70.     for(i=0; i<=9; i++)
  71.       Nosignextend((*dviw) -> dvifp, 4);
  72.       }
  73.       (*dviw) -> cpagep = (*dviw) -> ppagep;
  74.       (*dviw) -> ppagep = Nosignextend ((*dviw) -> dvifp, 4);
  75.     }
  76.     check(fseek((*dviw)->dvifp,(*dviw)->cpagep,0));
  77.     shownextpage (*dviw, xscreen, yscreen);
  78.   } else {
  79.     fprintf (stderr, "Terminal confusion in ShowDviPage.\n");
  80.     exit (1);
  81.   };
  82.   unlock_canvas ();
  83.   (*dviw) -> pagenum = pagenum;
  84.   return (pagenum);
  85. }
  86.  
  87. void shownextpage (dviw, xscreen, yscreen)
  88.      DVIW dviw;
  89.      int xscreen, yscreen;
  90. {
  91.     showpage (&(dviw -> cpagep), &(dviw -> ppagep), FALSE, 0, FALSE,
  92.           dviw -> dvifp, xscreen, yscreen);
  93. }  
  94.      
  95. /* Open a dvi file for input and display the first page.  If
  96.    something goes wrong, display an error and leave the current file
  97.    unaffected. Historical potential bug:  After this routine is
  98.    called, the first page displayed may have to be the first page in
  99.    the document.*/ 
  100. DVIW ReOpenDvi (olddvi, filename)
  101.      DVIW olddvi;
  102.      char *filename;
  103. {
  104.   FILE *newfp;
  105.   DVIW newdvi;
  106.  
  107.   preload = TRUE;
  108.    /* We have to explictly test for an empty file name here because of */
  109.   /* a Sun stdio bug. */
  110.   if ((*filename == '\0') || (newfp=fopen(filename,"r")) == NULL)  {
  111.     showerror ("Can't open your file.");
  112.     return (olddvi);
  113.   } else if ((Nosignextend(newfp, 1)) != PRE)  {
  114.     showerror ("Not a DVI file.");
  115.     fclose (newfp);
  116.     return (olddvi);
  117.   } else if (signextend (newfp, 1) != DVIFORMAT) {
  118.     showerror ("Wrong DVI file format.");
  119.     fclose (newfp);
  120.     return (olddvi);
  121.   } else {
  122.     clearerror ();
  123.     if (olddvi != NULL) CloseDvi (olddvi);
  124.     newdvi = NEWDVIW;
  125.     newdvi -> filename = malloc (strlen (filename) + 1);
  126.     strcpy (newdvi -> filename, filename);
  127.     newdvi -> modtime = modtime (filename);
  128.     newdvi -> dvifp = newfp;
  129.     newdvi -> pages = start_reading_dvi_file (newdvi -> dvifp);
  130.     newdvi -> pagenum = 0;
  131.     newdvi -> cpagep = -1;
  132.     newdvi -> ppagep = -1;
  133.     return (newdvi);
  134.   }
  135. }
  136.  
  137. int modtime (filename)
  138.      char *filename;
  139. {
  140.   struct stat buf;
  141.   check (stat (filename, &buf));
  142.   return (buf.st_mtime);
  143. }
  144.